Servlet技术(二) --请求和响应

开头提要

这一个章节中更重要的是HttpServletRequest对象的相关方法
主要技术概括如下:

  1. 网页的定时刷新和跳转
  2. 利用referer放盗链
  3. 获取请求参数以及通过request对象传递数据
  4. 请求重定向(数据会被丢失)
  5. 请求转发 (数据不会被丢失)
  6. 请求包含 (返回的包括主题servlet和包含的servlet两部分内容)
    在编写这方面的程序的时候经常会遇到乱码问题,详情请看字符乱码问题的解决办法

    HttpServletResponse对象

    发送状态码相关的方法

  7. setStatus(int status)方法
  8. sendError(int sc)方法
    public void sendError(int code) throws java.io.IOException
    public void sendError(int code, String message) throws java.io.IOException

相应的状态代码参数的描述如下:
statusmsg

发送响应消息头相关的方法

headmsg

发送响应消息体的相关方法

  • getOutputStream()方法 用于输出二进制格式的响应正文
  • getWriter()方法 用于输出内容全为字符文本的网页文档
    在此不进行过多的赘述和相关代码的实验了,需要注意的是:
    getOutputStream()和getWriter()方法都可以发送响应消息体,但是它们之间互相排斥,不可以同时使用,否则会发生IllegalStateException异常

网页定时刷新并跳转

HTTP协议中,定义了一个Refresh头字段,它可以通知浏览器在指定的时间内自动刷新并跳转到其他页面
response.setHeader(“Refresh”,”2,URL=http:xxxxxxxxx” 表示的是浏览器在2秒之后自动跳转到xxxxxxxxx的网站
response.setHeader(“Refresh”,”3”) 表示每隔3秒页面定时刷新

禁止浏览器缓存页面

response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");

请求重定向(重要)

工作原理如下:
sendRedirect
方法如下:
public void sendRedirect(java.lang.String location) throws java.io.IOException
在请求重定向的过程中,传输的信息会丢失

HttpServletRequest对象

获取请求行信息的相关方法

在这一小节里面主要是HTTP头字段的相关操作,所以掌握HTTP头字段和HTTP协议是十分有必要的,详情请看关于HTTP协议

  • 当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名,请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行信息的方法,如下表所示
    rowinfo1
    rowinfo1
    如上表所示,相关方法的效果已经表述的很详近了,在此不进行代码实验了
  • 当请求Servlet时,需要通过请求头向服务器传递附加信息,例如,客户端可以接受的数据类型,压缩方式,语言等等,具体方法如下表所示
    rowinfo3
    rowinfo4

利用referer请求头防止”盗链”

实现思路如下

  1. 获取referer头字段的值
  2. 获取网站的域名
  3. 判断:如果referer头字段的值不为空,并且网站的域名和referer头字段的值相等,就进行相应文件的下载什么的,否则就重定向到另外一个消息返回错误的网页上

主要的servlet代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
String referer = request.getHeader("referer");
String sitestart = "http://" + request.getServerName();
if (referer != null && referer.startsWith(sitestart))
{
out.println(referer + "<br/>");
out.println("你可以下载....");
}
else
{
out.println("您不是从本站链接过来的,三秒后将跳转到本站地址,如果没有反应请点击下面的链接");
out.println("<a href='/test1/index.html'>downloadindex</a>");
response.setHeader("Refresh", "3;URL=/test1/index.html");
}
out.close();
}

至于跳转到的网页代码,在此就不再贴出来了

获取请求参数

Parameter
这些方法基本上是用来处理表单数据的,没什么太多需要注意的地方,暂时不贴代码了

获取网络连接信息

network1
network1
以上就不再添加代码了,根据实际情况进行代码的编写就可以了

通过request对象传递数据(重要)

方法 效果
setAttribute(String name, Object o) 将一个对象与一个名称关联后存储进ServletRequest对象中
getAttribute(String name) 从ServletRequest对象中返回指定名称的属性对象
removeAttribute(String name) 从ServletRequest对象中删除指定名称的属性
getAttributeNames() 返回一个包含ServletRequest对象中所有属性名的Enumeration对象

RequestDispatcher接口

方法 效果
getRequestDispatcher(String path) 用于返回封装了某个路径所指定资源的RequestDispatcher对象
getNamedDispatcher(String name) 用于返回封装了某个Web资源的RequestDispatcher对象,传递给该方法的参数是在Web应用程序部署好的某个Web资源名称
forward(ServletRequest request,ServletResponse response) 该方法用于将请求从一个Servlet传递给另外的一个Web资源
include(ServletRequest request,ServletResponse response) 该方法用于将其它的资源作为当前响应内容包含进来

接下来进行最重要的两个概念了:

请求转发

原理如下图所示
forward
在请求转发的过程中传输的信息不会丢失

请求包含

原理如下图所示
forward

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器